package uy.org.softtech.cssuite.servicios;

import java.util.Set;

import uy.org.softtech.cssuite.entidad.cliente.Cliente;
import uy.org.softtech.cssuite.entidad.finanzas.Cuenta;
import uy.org.softtech.cssuite.excepciones.EntidadNoActualizadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoCreadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoEliminadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoEncontradaException;


/**
 * Interfaz por medio de la cual se acceden a los servicios relacionados a los clientes de la aplicación.
 *  
 * @author fabian.lobo
 */
public interface ServiciosClientes {

	/**
	 * Retorna una lista con informacion de los clientes registrados en la aplicación
	 * 
	 * @author fabian.lobo
	 */
	Set<Cliente> listarClientes();
	
	/**
	 * Retorna el registro de cliente asociado al identificador dado
	 * 
	 * @param id - Identificador del cliente
	 * @throws EntidadNoEncontradaException si no se encuentra un cliente con ese ID
	 * @author fabian.lobo
	 */
	Cliente buscarCliente(Long id) throws EntidadNoEncontradaException;
	
	/**
	 * Almacena los datos del nuevo cliente en la base de datos
	 * 
	 * @param cliente - Cliente con los datos a almacenar
	 * @param servicio - Nombre del servicio en donde se almacenan los datos
	 * @return el cliente almacenado
	 * @throws EntidadNoCreadaException si no se pueden almacenar los datos en la base de datos
	 * @author fabian.lobo
	 */
	Cliente crear(Cliente cliente, String servicio) throws EntidadNoCreadaException;

	/**
	 * Actualiza los datos del cliente en la base de datos
	 * 
	 * @param cliente - Cliente con los datos a actualizar
	 * @param servicio - Nombre del servicio en donde se actualizan los datos
	 * @return el cliente actualizado
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos en la base de datos
	 * @author fabian.lobo
	 */
	Cliente actualizar(Cliente cliente, String servicio) throws EntidadNoActualizadaException;
	
	/**
	 * Bloquea al cliente relacionado con el identificador dado
	 * 
	 * @param id - Identificador del cliente a bloquear
	 * @throws EntidadNoEncontradaException si no se encuentra un registro relacionado al identificador
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos del cliente
	 */
	void bloquearCliente(Long id) throws EntidadNoEncontradaException, EntidadNoActualizadaException;
	
	/**
	 * Desbloquea al cliente relacionado con el identificador dado
	 * 
	 * @param id - Identificador del cliente a desbloquear
	 * @throws EntidadNoEncontradaException si no se encuentra un registro relacionado al identificador
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos del cliente
	 */
	void desbloquearCliente(Long id) throws EntidadNoEncontradaException, EntidadNoActualizadaException;
	
	/**
	 * Elimina (de manera lógica) al cliente relacionado con el identificador dado
	 * 
	 * @param id - Identificador del cliente a eliminar
	 * @throws EntidadNoEncontradaException si no se encuentra un registro relacionado al identificador
	 * @throws EntidadNoEliminadaException si no se pueden actualizar los datos del cliente
	 */
	void eliminarCliente(Long id) throws EntidadNoEncontradaException, EntidadNoEliminadaException;

	/**
	 * Retorna el registro de la cuenta de cliente asociada al identificador dado
	 * 
	 * @param id - Identificador de la cuenta de cliente
	 * @throws EntidadNoEncontradaException si no se encuentra una cuenta con ese ID
	 * @author fabian.lobo
	 */
	Cuenta buscarCuenta(Long id) throws EntidadNoEncontradaException;

	/**
	 * Activa la cuenta asociada al identificador dado
	 * 
	 * @param id - Identificador de la cuenta de cliente
	 * @throws EntidadNoEncontradaException si no se encuentra una cuenta con ese ID
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos de la cuenta
	 * @author fabian.lobo
	 */
	void activarCuenta(Long id) throws EntidadNoEncontradaException, EntidadNoActualizadaException;

	/**
	 * Cancela la cuenta asociada al identificador dado
	 * 
	 * @param id - Identificador de la cuenta de cliente
	 * @throws EntidadNoEncontradaException si no se encuentra una cuenta con ese ID
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos de la cuenta
	 * @author fabian.lobo
	 */
	void cancelarCuenta(Long id) throws EntidadNoEncontradaException, EntidadNoActualizadaException;

	/**
	 * Cierra la cuenta asociada al identificador dado
	 * 
	 * @param id - Identificador de la cuenta de cliente
	 * @throws EntidadNoEncontradaException si no se encuentra una cuenta con ese ID
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos de la cuenta
	 * @author fabian.lobo
	 */
	void cerrarCuenta(Long id) throws EntidadNoEncontradaException, EntidadNoActualizadaException;

	/**
	 * Desactiva la cuenta asociada al identificador dado
	 * 
	 * @param id - Identificador de la cuenta de cliente
	 * @throws EntidadNoEncontradaException si no se encuentra una cuenta con ese ID
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos de la cuenta
	 * @author fabian.lobo
	 */
	void desactivarCuenta(Long id) throws EntidadNoEncontradaException, EntidadNoActualizadaException;

	/**
	 * Almacena los datos de la nueva cuenta de cliente en la base de datos
	 * 
	 * @param cuenta - Cuenta con los datos a almacenar
	 * @param servicio - Nombre del servicio en donde se almacenan los datos
	 * @return la cuenta almacenada
	 * @throws EntidadNoCreadaException si no se pueden almacenar los datos en la base de datos
	 * @author fabian.lobo
	 */
	Cuenta crearCuenta(Cuenta cuenta, String servicio) throws EntidadNoCreadaException;

	/**
	 * Actualiza los datos de la cuenta en la base de datos
	 * 
	 * @param cuenta - Cuenta con los datos a actualizar
	 * @param servicio - Nombre del servicio en donde se actualizan los datos
	 * @return la cuenta actualizada
	 * @throws EntidadNoEncontradaException si no se encuentra una cuenta con ese ID
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos en la base de datos
	 * @author fabian.lobo
	 */
	Cuenta actualizarCuenta(Cuenta cuenta, String servicio) throws EntidadNoEncontradaException, EntidadNoActualizadaException;

	/**
	 * Retorna una lista de las cuentas pertenecientes al cliente relacionado con el identificador dado
	 * 
	 * @param cliente - Identificador del cliente
	 * @author fabian.lobo
	 */
	Set<Cuenta> obtenerCuentas(Long cliente);
}

